package main

import (
	"fmt"
	"log"
	"os"
)

// log模块主要提供了3类接口。分别是 “Print 、Panic 、Fatal ”，对每一类接口其提供了3中调用方式，
// 分别是 "Xxxx 、 Xxxxln 、Xxxxf"

// 对于 log.Fatal 接口，会先将日志内容打印到标准输出，接着调用系统的 os.exit(1) 接口，
// 退出程序并返回状态 1 。但是有一点需要注意，由于是直接调用系统接口退出，defer函数不会被调用
func test_defer_fatal(){
	defer func() {
		fmt.Println("----First----")
	}()
	log.Fatalln("test for defer Fatalln")
	//调用Fatal  defer函数也不会被调用
}


//对于log.Panic接口，该函数把日志内容刷到标准错误后调用 panic 函数
func test_defer_panic(){
	defer func() {
		fmt.Println("---First---")
		if err := recover(); err!=nil{
			fmt.Println(err)
		}
	}()

	log.Panic("Test for defer Panic")

	//第二个defer 函数并没有输出，可见在Panic之后声明的defer是不会执行的。
	defer func(){
		fmt.Println("___Second___")
	}()
}



//自定义日志模块，输出到文件中
func CustomLogModule(){
	fileName := "app.log"
	logFile,err := os.Create(fileName)
	defer logFile.Close()

	if err!=nil{
		log.Fatalln("Open file error")
	}

	debugLog := log.New(logFile,"[Info]",log.Llongfile)
	debugLog.Println("A Info Message...")
	debugLog.SetPrefix("[Debug]")
	debugLog.Println("A Debug Message.....")
}


func main() {
	CustomLogModule()

	//test_defer_panic()

	//test_defer_fatal()
	//下面的Print语句也不会被调用

	arr:=[]int{22,33}
	log.Print("Print This is array",arr,"\n")
	log.Println("Println array",arr)
	log.Printf("Printf array with item [%d,%d]\n",arr[0],arr[1])
}
